package co.edu.uniandes.services;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import co.edu.uniandes.dto.Itinerario;
import co.edu.uniandes.services.constantes.ConsultaConstantes;

/**
 * Se encarga de la persistencia de un itinerario en 
 * base de datos
 * @author Diego Alejandro Olivera Rios <diegoalejo14@gmail.com>
 *
 */
public class ServicioItinerario implements IServicioItinerario {

	/**
	 *Se encarga de agregar un nuevo itinerario en base 
	 *de datos
	 *@param Itinerario itinerario que va a ser guardado
	 *@throws Si alguno de los datos que se va almacenar es vacio  o
	 *cuando se presenta algun problema con la base de dato 
	 */
	@Override
	public void insertar(Itinerario itinerario) throws Exception, RemoteException {
		PreparedStatement ps=null;
		try{
			if(itinerario==null || itinerario.getDescripcion()==null ||
					itinerario.getSeguidor()==null || itinerario.getIdViajero()==0){
				throw new Exception("No se puede guardar el itinerario ya que tiene datos sin diligenciar");				
			}
			Connection con=ConexionBD.getInstance().getConection();
			ps=con.prepareStatement(ConsultaConstantes.INSERT_ITINERARIO);
			ps.setString(1, itinerario.getDescripcion());
			ps.setString(2, itinerario.getSeguidor());
			ps.setInt(3, itinerario.getIdViajero());
			ps.execute();
		}catch (Exception e) {
			throw e;
		}
		finally{
			if(ps!=null && !ps.isClosed()){
				ps.close();
			}
		}
	}

	
	/**
	 *Se encarga de obtener todos los itinerarios que se encuentran en 
	 *base de datos
	 *@throws  Si se presenta algun problema en base de datos
	 */
	@Override
	public List<Itinerario> consultar() throws Exception, RemoteException {
		PreparedStatement ps=null;
		ResultSet rs=null;
		List<Itinerario> resultado=new ArrayList<Itinerario>();
		try{
			Connection con=ConexionBD.getInstance().getConection();
			ps=con.prepareStatement(ConsultaConstantes.CONSULTA_ITINERARIO);
			rs=ps.executeQuery();
			Itinerario itinerario;
			while(rs.next()){
				itinerario=new Itinerario();
				itinerario.setId(rs.getInt("id"));
				itinerario.setDescripcion(rs.getString("descripcion"));
				itinerario.setIdViajero(rs.getInt("idViajero"));
				itinerario.setSeguidor(rs.getString("seguidor"));
				resultado.add(itinerario);
			}
		}catch (Exception e) {
			throw e;
		}finally{
			if(rs!=null && !rs.isClosed()){
				rs.close();
			}
			if(ps!=null && !ps.isClosed()){
				ps.close();
				
			}
		}
		return resultado;
	}

	/**
	 *Se elimina de la base de datos un itinerario
	 *@param id Identificador del itinerario que va a ser eliminado
	 *@throws Se lanza en caso de que exista problemas con la
	 * base de datos 
	 */
	@Override
	public void eliminar(Integer id) throws Exception, RemoteException {
		PreparedStatement ps=null;
		try{
			Connection con=ConexionBD.getInstance().getConection();
			ps=con.prepareStatement(ConsultaConstantes.DELETE_ITINERARIO);
			ps.setInt(1, id);
			ps.execute();
		}catch (Exception e) {
			throw e;
		}finally{
			if(ps!=null && !ps.isClosed()){
				ps.close();
			}
		}
	}

}
